﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TestesFixacao.Dominio;
using TestesFixacao.Dominio.Repositorios;
using TestesFixacao.Dominio.Modelos;
using TestesFixacao.WindowsApp.Properties;

namespace TestesFixacao.WindowsApp
{
    public partial class Principal : Form
    {
        private IRepositorioDisciplina _repositorioDisciplina;

        private Disciplina _disciplina;

        public Principal()
        {
            InitializeComponent();
            _repositorioDisciplina = new RepositorioDisciplina();
        }

        #region botões menu
        
        private void importarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {

                _repositorioDisciplina.Importa(openFileDialog1.FileName);

                listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());

                MessageBox.Show(Resources.mensagemImportacaoSucesso, "", MessageBoxButtons.OK,
                             MessageBoxIcon.Information);
            }
        }

        private void exportarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                _repositorioDisciplina.Exporta(saveFileDialog1.FileName);

                listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());

                MessageBox.Show(Resources.mensagemExportacaoSucesso, "", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
        
        #endregion

        #region botões disciplina

        private void btnGravarDisciplina_Click(object sender, EventArgs e)
        {
            if (_disciplina == null) MontaDisciplina();

            if (int.Parse(txtDisciplinaNumero.Text) > 0)
            {
                _repositorioDisciplina.Edita(_disciplina);
            }
            else
                _repositorioDisciplina.Adiciona(_disciplina);

            LimpaCampos(txtDisciplinaNome, txtDisciplinaNumero, listQuestoes);

            listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());

            _disciplina = null;
        }

        private void btnEditarDisciplina_Click(object sender, EventArgs e)
        {
            Disciplina disciplinaSelecionada = listDisciplinas.SelectedItem as Disciplina;

            if (disciplinaSelecionada == null)
            {
                MessageBox.Show(Resources.disciplinaNaoSelecionada);
                return;
            }

            txtDisciplinaNumero.Text = disciplinaSelecionada.Numero.ToString();
            txtDisciplinaNome.Text = disciplinaSelecionada.Nome;
            listQuestoes.Items.OverrideAll(disciplinaSelecionada.Questoes);

            tabDisciplinas.SelectedTab = tabDisciplinaInsercaoEdicao;

            _disciplina = disciplinaSelecionada;
        }

        private void btnNovoDisciplina_Click(object sender, EventArgs e)
        {
            LimpaCampos(txtDisciplinaNome, txtDisciplinaNumero, listQuestoes);
        }

        private void btnExcluirDisciplina_Click(object sender, EventArgs e)
        {
            Disciplina disciplinaSelecionada = listDisciplinas.SelectedItem as Disciplina;

            if (disciplinaSelecionada == null)
            {
                MessageBox.Show(Resources.disciplinaNaoSelecionada);
                return;
            }
            if (MessageBox.Show(Resources.perguntaExclusaoDisciplina, "Aviso", MessageBoxButtons.OK,
                            MessageBoxIcon.Question) == DialogResult.OK)
            {
                _repositorioDisciplina.Exclui(disciplinaSelecionada);

                listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());
            }
        }

        #endregion

        #region botões questão

        private void btnInserirQuestao_Click(object sender, EventArgs e)
        {
            if (_disciplina == null) MontaDisciplina();

            QuestaoDialog dialog = new QuestaoDialog();
            dialog.Questao = new Questao();

            DialogResult resposta = dialog.ShowDialog();

            if (resposta == DialogResult.OK)
            {
                var questao = dialog.Questao;

                _disciplina.AdicionaQuestao(questao);
                listQuestoes.Items.OverrideAll(_disciplina.Questoes);
            }
        }

        private void btnEditarQuestao_Click(object sender, EventArgs e)
        {
            Questao questaoSelecionada = listQuestoes.SelectedItem as Questao;

            if (questaoSelecionada == null)
            {
                MessageBox.Show(Resources.questaoNaoSelecionada, "Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return;
            }

            QuestaoDialog dialog = new QuestaoDialog();
            dialog.Questao = questaoSelecionada;

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                var questao = dialog.Questao;

                _disciplina.EditaQuestao(questao);

                listQuestoes.Items.OverrideAll(_disciplina.Questoes);
            }
        }

        private void btnExcluirQuestao_Click(object sender, EventArgs e)
        {
            Questao questaoSelecionada = listQuestoes.SelectedItem as Questao;

            if (questaoSelecionada == null)
            {
                MessageBox.Show(Resources.questaoNaoSelecionada, "Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return;
            }

            if (MessageBox.Show(Resources.perguntaExclusaoQuestao, "Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Question) == DialogResult.OK)
            {
                _disciplina.RemoveQuestao(questaoSelecionada.Numero);

                listQuestoes.Items.OverrideAll(_disciplina.Questoes);
            }
        }

        #endregion

        #region métodos privados

        private void MontaDisciplina()
        {
            _disciplina = new Disciplina();

            _disciplina.Nome = txtDisciplinaNome.Text;
        }

        private void LimpaCampos(params Control[] componentes)
        {
            foreach (var componente in componentes)
            {
                if (componente is ListBox)
                    ((ListBox)componente).Items.Clear();
                else
                    componente.ResetText();
            }

            txtDisciplinaNumero.Text = "0";
        }
        #endregion

      

    }
}